
console.log(1);

// 宏任务 ( macro task )
// 1、整体代码 (比如在HTML的script元素中直接书写的代码)
// 2、setTimeout
// 3、setInterval
// 4、setImmediate (Node.js 环境)
// 5、UI事件
// 6、I/O

let fn = () => {
    console.log(2);
}

// 调用 setTimeout 函数导致在 宏任务队列 末尾添加一个 宏任务 ( 未来用于调用 fn 函数)
setTimeout( fn , 0 );

// 微任务 ( micro task )
// 1、Promise
// 2、MutationObserver
// 3、Object.observe
// 4、process.nextTick(Node.js 环境)

let mt = ()=> console.log(3) ;
// 当 Promise 的状态 由 pending 变为 fulfilled 时就会将一个 微任务 添加到 微任务队列 末尾
// 哪个宏任务导致了 Promise 的状态 由 pending 变为 fulfilled 就在哪个宏任务执行之后再执行 这个微任务
new Promise( (resolve,reject) => resolve() ).then( mt );

// 知乎: https://zhuanlan.zhihu.com/p/78113300
console.log( 4 );